﻿using System.Collections.Generic;
using SoftwareConsulting.BI11.NumericalMethods.Interfaces;

namespace SoftwareConsulting.BI11.NumericalMethods.Curves
{
    /// <summary>
    /// Интерфейс кривой, представляющей собой ряд двумерных точек.
    /// </summary>
    public interface ICurve : IPointsSeries
    {
        void AddPoint(double x, double y);
        void RemovePointAt(int index);
    }
    
    /// <summary>
    /// Класс кривой, представляющей собой ряд двумерных точек.
    /// </summary>
    public class Curve : IPointsSeries, ICurve
    {        
        private List<double[]> _points; //точки кривой

        /// <summary>
        /// Возвращает/устанавливает точки кривой
        /// </summary>
        protected List<double[]> Points
        {
            get
            {
                return _points;
            }
            set
            {
                _points = value;
            }
        }

        /// <summary>
        /// Конструктор класса
        /// </summary>
        public Curve()
        {
            _points = new List<double[]>();
        }

        /// <summary>
        /// Добавляет новую точку в кривую
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public void AddPoint(double x, double y)
        {
            _points.Add(new double[] { x, y });
        }

        /// <summary>
        /// Удаляет точку из кривой по указанной позиции
        /// </summary>
        /// <param name="index"></param>
        public void RemovePointAt(int index)
        {
            _points.RemoveAt(index);
        }

        /// <summary>
        /// Возвращает число точек в кривой
        /// </summary>
        public int BinsCount
        {
            get 
            { 
                return _points.Count; 
            }
        }

        /// <summary>
        /// Возвращает значение X-координаты точки в указанной позиции
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public double GetXAt(int index)
        {
            return _points[index][0];
        }

        /// <summary>
        /// Возвращает значение Y-координаты точки в указанной позиции
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public double GetYAt(int index)
        {
            return _points[index][1];
        }
    }
}
